package ru.pb.game.network.engine.client.packets.sendable;

import java.awt.Color;

import ru.pb.game.network.engine.client.packets.GameServerToClientPacket;
import ru.pb.game.objects.model.clan.Clan;
import ru.pb.game.objects.model.players.Player;
import ru.pb.game.objects.model.players.enums.SLOT_STATE;
import ru.pb.game.objects.model.room.Room;
import ru.pb.game.objects.storage.ObjectsStorage;
import ru.pb.global.data.model.ClanInfo;

public class PROTOCOL_LOBBY_JOIN_ROOM_ACK extends GameServerToClientPacket
{
	private Room _room;

	public PROTOCOL_LOBBY_JOIN_ROOM_ACK(Player p)
	{
		_room = p.getRoom();
	}

	public void runImpl()
	{}

	@Override
	public void writeImpl()
	{
		writeH(2828);
		writeD(0x0C);
		writeD(_room.getLeader().getSlot());
		writeD(0x0C);
		writeS(_room.name, Room.NET_ROOM_NAME_SIZE); // Название комнаты
		writeC(_room.map_id); // ID Карты
		writeC(); // Неясно
		writeC(); // Неясно

		writeC(_room.room_type); // Тип игры.
		writeC(); // Хз 0
		writeC(1); // ХЗ
		writeC(_room.getSlotCount()); // кол-во слотов.

		writeC(5); // хз Пинг?
		writeC(_room.allweapons); // Ограничение по оружию
		writeC(_room.random_map); // Случайная карта - 2
		writeC(_room.special); // Специальный тип боя)

		writeS(_room.getLeader().getName(), Player.NET_NICK_NAME_SIZE); // Непонятно всегда нули

		writeC(_room.killtime); // Условия - количество убийств(Маска, складываются порядковые номера)
		writeC();
		writeC();
		writeC();
		writeC(_room.limit); // Лимит на вход
		writeC(_room.seeConf); // Настройки наблюдения
		writeH(_room.autobalans); // Автобаланс
		writeC(0);
		writeD(_room.getLeader().getSlot()); // host slot?
		// //

		for(int i = 0; i < 16; i++)
		{
			Player p = _room.getPlayerBySlot(i);
			if(p != null)
			{
				_log.info("Player: " + p.getName());
				ClanInfo c = p.getPlayerInfos().getClanInfo();
				SLOT_STATE st = _room.getSlotState(p.getSlot());
				writeC(st.ordinal());
				writeH(p.getPlayerInfos().getRank());
				writeD();
				writeB(new byte[8]);
				writeC(c.getClanLogo().getLogo1()); // иконка клана
				writeC(c.getClanLogo().getLogo2()); // иконка клана
				writeC(c.getClanLogo().getLogo3()); // иконка клана
				writeC(c.getClanLogo().getLogo4()); // иконка клана
				writeH(c.getClanLogo().getLogoColor()); // иконка клана
				writeS(c.getClanName(), Clan.NET_CLAN_NAME_SIZE);
				writeD();
			}
			else
			{
				writeB(new byte[42]);
			}
		}

		writeC(_room.getAllPlayers().size()); // количество игроков?
		Player member = null;
		for(int objId : _room.getAllPlayers().toArray())
		{
			member = ObjectsStorage.getInstance().getPlayer(objId);
			writeC(member.getSlot()); // слот?
			writeC(member.getName().length()); // длина ника
			writeS(member.getName()); // nickname
			writeC(0); // цвет
		}

		writeC(_room._aiCount);
		writeC(_room._aiLevel);
	}
}